package com.powernode.controller;

import com.powernode.common.Constants;
import com.powernode.common.Result;
import com.powernode.common.UploadBean;
import com.powernode.domain.User;
import com.powernode.service.UserService;
import com.powernode.utils.WebMvcUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.File;
import java.io.FileInputStream;
import java.util.UUID;

/**
 * 内容:用来处理文件上传和下载
 * 作者:
 *
 */
@RestController
@RequestMapping("file")
public class FileController {
    @Resource
    private UserService userService;

    @Resource
    private UploadBean uploadBean;


    /**
     * 接收上传的文件
     */
    @RequestMapping("uploadImg.do")
    public Result uploadImg(MultipartFile mf){
        /**
         * 处理文件
         * 1,得到文件名
         * 2,修改文件名
         * 3,保存文件到硬盘
         * 4,构造相对路径  并把相对路径保存到数据库
         */
        String oldName=mf.getOriginalFilename();
        String newName=createNewFileName(oldName);
        try {
            //保存临时空间的文件到指定地址，并删除临时空间的文件
            mf.transferTo(new File(uploadBean.getUploadPath()+newName));
            //走到这里说明文件已上保存  更新用户表里面的img的值
            //组装相对路径
            String path=newName;
            //得到当前用户信息
            User user=new User();
            user.setId(WebMvcUtils.getCurrentUser().getId());
            user.setImg(path);
            //更新
            userService.updateByPrimaryKeySelective(user);
            WebMvcUtils.getSession().setAttribute(Constants.SESSION_USER_KEY,this.userService.selectByPrimaryKey(user.getId()));
            String fullPath=uploadBean.getBaseURL()+path;
            return new Result(0,"上传成功",0L,fullPath);
        }catch (Exception e){
            e.printStackTrace();
            return new Result(-1,"上传失败");
        }
    }

    /**
     *文件下载的方法
     */
    @RequestMapping("download.do")
    public ResponseEntity<Byte[]> download(String path) throws Exception {
        File file = new File(uploadBean.getUploadPath(),path);//本地磁盘文件
        if(!file.exists()){
            return null;
        }
        //使用输入流  将文件读入内存中
        FileInputStream fis = new FileInputStream(file); // 找参照物   将程序运行的内存当做参照物
        //文件的大小
        long length = file.length();
        //创建一个和文件一样大小的字节数组  一次性将数据读入到内存中  如果文件量过大，请求比较频繁 存在 崩溃的风险
        byte[] fileByte = new byte[(int) length];//一个G 的   byte 数组  64 G    65个人下载   1分钟
        //一次性将文件数据读入到数组中
        fis.read(fileByte);
        // springmvc 中封装的 响应实体 ：
        //设置响应码
        //设置响应的数据头信息
        //设置响应数据
        HttpHeaders headers = new HttpHeaders(); //响应头信息
        //设置响应的数据为流数据  告诉浏览器 不要解析
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        //设置下载的文件的名称  中文字符串要进行编码
        headers.setContentDispositionFormData("filename","1.jpg");
        ResponseEntity responseEntity = new ResponseEntity(fileByte,headers, HttpStatus.OK);
        return responseEntity;
    }



    /**
     * 根据老名构造一个新的不重复的文件名
     * @param oldName
     * @return
     */
    private  String createNewFileName(String oldName) {
        //得到后缀名
        String sdf=oldName.substring(oldName.lastIndexOf("."));
        return UUID.randomUUID().toString().replace("-","").toUpperCase()+sdf;
    }
}
